مفهوم و تاریخچه قراردادهای هوشمند
آشنایی با آسیبپذیریهای قراردادهای هوشمند و در امان ماندن از خطرات ناشی از این آسیبپذیریها، از چالشهای کلیدی در بلاک چین است که در این مقاله به طور مفصل به آن میپردازیم.
قراردادهای هوشمند، برنامههای کامپیوتری هستند که روی بلاک چین اجرا میشوند و میتوانند عملیات مالی و منطقی را به صورت خودکار و قابل اعتماد، انجام دهند؛ این قراردادها، بر اساس شرایط و قوانینی که در کد آنها تعریف شده، عمل میکنند و نیاز به واسطه یا دخالت انسانی ندارند. از جمله مزایایی که قراردادهای هوشمند برای کاربران خود به ارمغان میآورند میتوان به کاهش هزینهها، افزایش سرعت، افزایش شفافیت و افزایش اطمینان اشاره کرد.
با توجه به مزایا و فواید قراردادهای هوشمند، میتوان گفت که این برنامههای کامپیوتری کاربردهای فراوان و گستردهای در زمینههای مختلف دارند، اما مانند هر فناوری دیگری، یکی از موضوعات مهم و چالش برانگیز در زمینه بلاک چین و ارزهای دیجیتال، امنیت قراردادهای هوشمند است.
قراردادهای هوشمند که به عنوان نوعی پروتکل کامپیوتری برای ایجاد و اجرای توافقات بین طرفین مختلف بدون نیاز به واسطهگری استفاده میشوند، ممکن است آسیبپذیریها و نقصهایی هم داشته باشند که باعث سرقت، تقلب، سواستفاده یا از دست رفتن داراییهای دیجیتال شوند.
پیشتر در مقالههای معرفی بلاک چین و قرارداد هوشمند با هردوی این فناوریها به طور کامل آشنا شدیم، حال در این مقاله از بیت پین قصد داریم درباره آسیبپذیریهای قراردادهای هوشمند صحبت کنیم و به بررسی راهکارهای در امان ماندن از آنها بپردازیم.
مفهوم و تاریخچه قراردادهای هوشمند
قرارداد هوشمند، پروتکلی کامپیوتری است که شرایط قرارداد را تعریف و آنها را به صورت خودکار اجرا میکند؛ این قراردادها قابل پیگیری و غیرقابلبازگشت هستند و معمولاً روی بلاک چینهای قابل برنامهریزی مانند اتریوم (Ethereum) نوشته میشوند. اصطلاح قرارداد هوشمند، اولین بار در سال ۱۹۹۴ توسط Nick Szabo استفاده شد و این قراردادها، شامل تمام اطلاعات مربوط به شرایط قرارداد و اجرای تمام اقدامات هدفگذاریشده بهطور خودکار میشوند.
البته ایده اولیه قراردادهای هوشمند به قرنها قبل، یعنی زمانی که مردم برای انجام معاملات تجاری خود از کدهای رمزگذاریشده استفاده میکردند، برمیگردد، اما این ایده در نهایت در سال ۲۰۱۵ با راهاندازی اتریوم، برای اولین بار اجرایی شد.
درواقع، توسعه فناوریهای جدیدی مانند بلاک چین، باعث شده تا ایده قراردادهای هوشمند به واقعیت تبدیل شود؛ بلاک چین، فناوری توزیعشدهای است که اطلاعات را به صورت امن و غیرقابلتغییر ذخیره میکند و به همین دلیل هم، برای اجرای قراردادهای هوشمند، فناوری ایدهآلی است.
قراردادهای هوشمند، در امور مالی برای تسهیل پرداختها، مدیریت داراییها و ارائه خدمات مالی، در تجارت، برای اتوماسیون فرآیندهای تجاری، مانند خرید و فروش محصولات و خدمات، در انجام فرایندهای دولتی، مانند رایگیری و پرداخت مالیات، در صنعت بهداشت و درمان، برای مدیریت پروندههای پزشکی، ردیابی داروها و ارائه مراقبتهای بهداشتی از راه دور و در مدیریت شبکههای انرژی، مانند خرید و فروش برق، استفاده شوند. این قراردادها، پتانسیل ایجاد انقلاب در بسیاری از صنایع را دارند و میتوانند باعث کارآمدتر شدن امور، کاهش هزینهها و بهبود شفافیت شوند. برخی از مزایای قراردادهای هوشمند عبارتاند از:
- خودکارسازی: قراردادهای هوشمند میتوانند فرآیندهای دستی را به فرایندهای اتوماتیک تبدیل کرده و باعث صرفهجویی در زمان و هزینه شوند.
- شفافیت: قراردادهای هوشمند در دفتر کل توزیعشدهای ذخیره میشوند و قابل پیگیری هستند؛ این امر باعث افزایش شفافیت و اعتماد میشود.
- امنیت: قراردادهای هوشمند از فناوریهای رمزنگاری برای ایمنسازی اطلاعات استفاده میکنند و عموما در برابر دستکاری و کلاهبرداری مقاوم هستند.
- قابلیت اعتماد: قراردادهای هوشمند توسط شبکهای توزیعشده اجرا میشوند و در برابر از کار افتادگی یک واحد، مقاوم هستند.
البته قراردادهای هوشمند با برخی محدودیتها، مانند پیچیدگی و دشواری برای توسعه، اشکالات یا نقاط ضعف و در حال توسعه بودن مقرراتشان هم روبهرو هستند.
انواع آسیبپذیریهای قراردادهای هوشمند چیست؟
آسیبپذیریهای قراردادهای هوشمند، مشکلات و نقصهایی هستند که باعث میشوند قراردادهای هوشمند به صورت ناخواسته، نامطلوب، ناقص یا نادرست عمل کنند. این آسیبپذیریها، میتوانند به دلایل مختلفی ایجاد شوند:
وجود خطا در کدها
وجود خطا در منطق کدها به عنوان یکی از آسیبپذیریهای قراردادهای هوشمند، زمانی رخ میدهد که منطق کدهای قرارداد هوشمند ایراد، ابهام، تضاد یا ناسازگاری داشته باشند. چنین خطایی ممکن است در زمان نوشتن، تست یا حسابرسی کدها به چشم نیاید، اما در زمان اجرای قرارداد هوشمند به عملکردهای غیرمنتظرهای منجر شود. برای مثال، در سال ۲۰۱۶، قرارداد هوشمندی به نام دائو (The DAO) که برای حمایت از پروژههای بلاک چینی نوشته شده بود، خطایی منطقی داشت و این خطا باعث شد که هکری بتواند حدود ۵۰ میلیون دلار اتر (ETH) از شبکه اتریوم را به حساب خود منتقل کند.
ناسازگاری با پروتکل بلاک چین
ناسازگاری با پروتکل بلاک چین، به عنوان یکی از آسیبپذیریهای قراردادهای هوشمند، زمانی رخ میدهد که قرارداد هوشمند با پروتکل بلاک چینی که روی آن اجرا میشود، سازگار نباشد؛ این ناسازگاری ممکن است در زمان ایجاد تغییرات در پروتکل بلاک چین یا در زمان تعامل با بلاک چینهای دیگر رخ دهد.
برای مثال، در سال ۲۰۱۷، قرارداد هوشمندی برای Parity Multisig Wallet که برای نگهداری و انتقال اتر بود، به دلیل ناسازگاری با پروتکل اتریوم، باعث شد تا حدود ۵۱۴ میلیون دلار، رمزارز اتر قفل شده و دسترسی به آن دیگر امکانپذیر نباشد.
درواقع، Parity Multisig Wallet، کیف پولی چندامضایی است که روی بلاک چین اتریوم ساخته شده و برای افزایش امنیت و جلوگیری از دسترسی غیرمجاز به داراییها، امکان مدیریت چندامضایی داراییها را فراهم میکند، در این کیف پول برای انجام یک تراکنش، به تایید اکثریت امضاها نیاز است. پس از هک Parity Multisig Wallet در سال ۲۰۱۷، نسخه جدیدی از کیف پول منتشر شد که از آسیبپذیریهای قراردادهای هوشمند نسخه قبلی، محافظت میکرد.
فراموش کردن تابع Selfdestruct
فراموش کردن تابع Selfdestruct، یکی از آسیبپذیریهای قراردادهای هوشمند است و زمانی رخ میدهد که قرارداد هوشمند فاقد تابع Selfdestruct باشد؛ تابع Selfdestruct به طور پیشفرض در زبان برنامهنویسی Solidity موجود است و به قرارداد هوشمند اجازه میدهد خود را حذف کرده و داراییهای خود را به آدرسی دلخواه منتقل کند.
چنانچه قرارداد هوشمند فاقد تابع Selfdestruct باشد، ممکن است در صورت وجود خطا یا ناسازگاری با پروتکل بلاک چین، دچار فروپاشیدگی (Freeze) شود و داراییهای خود را از دست بدهد. برای مثال، در سال ۲۰۱۷، نبود تابع Selfdestruct در قرارداد هوشمندی به نام Rubixi که برای ایجاد سیستم پرداخت هرمی راهاندازی شده بود، باعث شد دسترسی به حدود ۴۰ هزار دلار اتر (ETH) مسدود شود.
Rubixi، روی توسعه پروتکلهای مالی باز و غیرمتمرکز با تمرکز بر امنیت و شفافیت تمرکز دارد و از سیستمی چندامضایی برای افزایش امنیت استفاده میکند؛ علاوهبراین، از سیستمی برای ایجاد شفافیت استفاده میکند که امکان مشاهده تمام تراکنشها را در بلاک چین در اختیار کاربران میگذارد.
استفاده نادرست از Delegatecall
استفاده نادرست از Delegatecall، یکی دیگر از آسیبپذیریهای قراردادهای هوشمند است و زمانی رخ میدهد که قرارداد هوشمند از تابع Delegatecall به صورت نادرست یا با بیاحتیاط استفاده کند؛ در برنامهنویسی قراردادهای هوشمند، تابع Delegatecall، اپکدی است که به قرارداد امکان میدهد تا تابعی را از قرارداد دیگری فراخوانی کند؛ این بدان معنا است که قرارداد میتواند کد قرارداد دیگری را بدون اینکه آن قرارداد را به طور مستقیم فراخوانی کند، اجرا کند. این به طور پیشفرض در زبان برنامهنویسی سالیدیتی (Solidity) موجود است.
تابع Delegatecall ابزاری قدرتمند است که برای بهبود قابلیت همکاری و انعطافپذیری قراردادهای هوشمند استفاده شود. با این حال، مهم است که از این تابع با دقت استفاده شود، چرا که میتواند در معرض آسیبپذیریهای امنیتی قرار بگیرد؛ اگر قرارداد هوشمند از تابع Delegatecall به صورت نادرست یا با بیاحتیاط استفاده کند، ممکن دچار تغییرات ناخواسته شود و امنیت داراییهای خود را به خطر بیندازد.
برای مثال، در سال ۲۰۱۷، استفاده نادرست از تابع Delegatecall در قرارداد هوشمندی به نام Parity Multisig Wallet که برای نگهداری و انتقال اتر استفاده میشد، باعث شد تا کاربری بتواند تابع Selfdestruct را فعال کرده و دسترسی به حدود ۱۵۰ میلیون دلار اتر را از بین ببرد.
حملات بازگشتپذیر (Reentrancy)
حملات بازگشتپذیر یا Reentrance هم از آسیبپذیریهای قراردادهای هوشمند است و نوعی حمله امنیتی به قراردادهای هوشمند به حساب میآید که که در آن هکر با استفاده از تابعی به نام Fallback، برای فراخوانی مجدد استفاده میکند. این امر میتواند منجر به از دست دادن داراییها، سرقت اطلاعات، یا اختلال در عملکرد قراردادهای هوشمند شود.
در زبان برنامهنویسی سالیدیتی تابعی به نام Fallback وجود دارد که پارامتری نداشته و به صورت دلخواه برنامهنویسی میشود. از آنجا که هر تابع با یک امضا شناسایی میشود، به محض فراخوانی هر تابع، امضای آن به عنوان ورودی به قرارداد فراخواننده ارسال میشود؛ چنانچه امضاها منطبق باشند، کد مربوطه اجرا میشود و در غیر این صورت، تابع Fallback فراخوانی میشود. پس اگر در قراردادی، تابعی بدون امضا باشد هم به این تابع ارجاع داده میشود و در چنین شرایطی، هکرها میتوانند با این ترفند و با فراخوانی مکرر، اتر یا گس فی مصرف کنند.
در سال ۲۰۱۶، حملهای بازگشتپذیر در قرارداد هوشمند دائو (The DAO) باعث شد تا هکری حدود ۵۰ میلیون دلار اتر را به حساب خود منتقل کند. علاوهبراین، حمله بازگشتپذیر Bancor در سال ۲۰۱۷ که منجر به از دست رفتن ۱۰ میلیون دلار شد و حمله بازگشتپذیر Harvest Finance، در سال ۲۰۲۲ که منجر به از دست رفتن ۳۰ میلیون دلار شد، دو نمونه دیگر از این نوع حمله هستند.
حملات اوراکل (Oracle)
حملات اوراکل (Oracle)، نوعی دیگر از آسیبپذیریهای قراردادهای هوشمند و نوعی حمله امنیتی است که در آن هکر از اوراکلی برای دستکاری در دادههای ورودی قرارداد استفاده میکند.
قراردادهای هوشمند برای دریافت دادههایی مانند قیمت ارزهای دیجیتال، به منبعی خارجی یا همان اوراکل (Oracle) نیاز دارند که این منبع خارجی، ممکن است دچار خطا، تقلب، تاخیر یا حمله شود و دادههای نادرست یا منسوخ شدهای را به قراردادهای هوشمند ارسال کند. برای مثال، در سال ۲۰۱۹، حمله اوراکل به قرارداد هوشمندی به نام Synthetix، باعث شد تا کاربری بتواند حدود ۳۷ میلیون دلار از ارز مصنوعی را با قیمتی نادرست خریداری کند.
Synthetix، پروتکلی غیرمتمرکز است که امکان ایجاد و معامله داراییهای مصنوعی مانند ارزهای فیات، سهام و کالاها را فراهم میکند؛ این داراییهای مصنوعی، که Synth نام دارند، با استفاده از سیستم وثیقهگذاری ایجاد میشوند. Synthها روی شبکه اتریوم ساخته شده و با استفاده از قراردادهای هوشمند مدیریت میشوند. این داراییهای مصنوعی، با هدف افزایش نقدینگی در بازارهای مالی، کاهش ریسک و دسترسی به داراییهای جدید ایجاد میشوند.
حملات Underflow/Overflow
حملات Underflow/Overflow هم به عنوان یکی از آسیبپذیریهای قراردادهای هوشمند، زمانی رخ میدهد که قرارداد هوشمند در حین انجام عملیات ریاضی، با مقادیری خارج از محدوده متغیرهای خود روبهرو شود. این مسئله، ممکن است باعث شود تا قرارداد هوشمند به صورت ناخواسته، پول را افزایش یا کاهش دهد.
برای مثال، در سال ۲۰۱۸، قرارداد هوشمندی به نام BEC Token که برای ارائه ارز دیجیتال بود، دچار حمله Underflow/Overflow شد و هکری توانست تعدادی نامحدودی از توکنها را به حساب خود منتقل کند.
حملات فرانت رانینگ (Front Running)
فرانت رانینگ، هشتمین مورد از آسیبپذیریهای قراردادهای هوشمند در فهرست ما، زمانی رخ میدهد که در حین انجام معاملات مالی، قرارداد هوشمند با تاخیر در تایید تراکنشها روبهرو شده و به صورت نامطلوب یا غیرعادلانه عمل کند. برای مثال، در سال ۲۰۱۹، قرارداد هوشمندی به نام یونی سوآپ (Uniswap) که برای ارائه صرافی غیرمتمرکز بود، دچار حمله فرانت رانینگ شد و هکری توانست با استفاده از اطلاعات داخلی (Prior Knowledge) و پیشسفارش (Pre Order)، قیمت توکنی را به صورت نامطلوب تغییر داده و سود زیادی به جیب بزند.
حملات جانبی
حملات جانبی در آسیبپذیریهای قراردادهای هوشمند، حملاتی هستند که از آسیبپذیریهای شبکه بلاک چین یا سیستمهای دیگر برای آسیب رساندن به قراردادهای هوشمند استفاده میکنند. این حملات، حملات DoS، برای سرنگون کردن شبکه بلاک چین و جلوگیری از دسترسی به قراردادهای هوشمند، حملات ۵۱ درصد، برای گرفتن کنترل بیش از ۵۱ درصد از قدرت هش شبکه بلاک چین و تأیید تراکنشهای جعلی یا تغییر تاریخچه و حملات شبکهای برای دسترسی غیرمجاز به شبکه بلاک چین و سرقت داراییهای ذخیره شده در قراردادهای هوشمند را شامل میشوند.
امنیت قراردادهای هوشمند چگونه تامین میشود؟
موارد اشاره شده بالا، برخی از شایعترین آسیبپذیریهای قراردادهای هوشمند موجود هستند و موارد بیشتر دیگری هم ممکن ست وجود داشته باشند. در ادامه راه حلهای موجود و پیشنهادی برای بهبود امنیت قراردادهای هوشمند را معرفی خواهیم کرد.
نقش توسعهدهندگان در کاهش خطرات ناشی از آسیبپذیریهای قراردادهای هوشمند
توسعهدهندگان قراردادهای هوشمند نقش مهمی در کاهش خطرات ناشی از آسیبپذیریهای این قراردادها دارند. توسعهدهندگان میتوانند با رعایت چند نکته، امنیت و کارایی قراردادهای هوشمند را افزایش دهند. برخی از این نکتهها عبارتاند از:
- استفاده از زبانهای برنامهنویسی مناسب و مورد تأیید برای نوشتن قراردادهای هوشمند؛ برخی از زبانهای برنامهنویسی مخصوص قراردادهای هوشمند مانند سالیدیتی (Solidity)، وایپر (Vyper) و Scilla، ویژگیها و قابلیتهایی دارند که به جلوگیری از خطاها و آسیبپذیریها کمک میکنند.
- استفاده از الگوریتمها و شیوههای منطقی برای جلوگیری از Overflow و Underflow برای نوشتن کدها. برای مثال، استفاده از عبارات شرطی، حلقهها، توابع و استثناها برای کنترل جریان برنامه و جلوگیری از ورود مقادیر خارج از محدوده.
- استفاده از منابع خارجی یا همان اوراکلهای قابل اعتماد و مورد تأیید برای دریافت دادههای غیرقابل تولیدی مانند قیمت ارزهای دیجیتال یا استفاده از روشهای مختلف برای تأیید صحت و بهروز بودن دادههای دریافتی. برای مثال، استفاده از منابع خارجی چندگانه و مقایسه دادههای آنها.
- استفاده از روشهای رمزنگاری و تحلیل ریاضی برای تضمین صحت دادهها و عملکردهای قرارداد هوشمند. برای مثال، استفاده از تابع هش، تابع رمزگذار، تابع رمزگشا و تابع امضا.
- استفاده از قراردادهای هوشمند واسط و پیشگیر برای کاهش ریسک؛ این قراردادهای هوشمند میتوانند به عنوان لایههای محافظ میان قراردادهای هوشمند پایه و کاربران یا سرویسدهندگان عمل کنند.
- بازبینی و بررسی کد قرارداد هوشمند توسط نهادهای شخص ثالث، قبل از پیادهسازی و اجرای آنها؛ در این بازبینیها ممکن است مشکلات مربوط به طراحی قراردادها و آسیبپذیریهای امنیتی و خطاهای مرتبط با کد مشخص شوند.
نقش کاربران در کاهش خطرات ناشی از آسیبپذیریهای قراردادهای هوشمند
کاربران هم مانند توسعهدهندگان میتوانند در کاهش خطرات ناشی از قراردادهای هوشمند نقش مهمی ایفا کنند؛ تنها کافی است تا با رعایت چند نکته، امنیت و کارایی قراردادهای هوشمند را افزایش دهند. برخی از این نکات عبارتاند از:
- بررسی کد قرارداد هوشمند قبل از استفاده از آن؛ کاربران میتوانند با استفاده از ابزارهای تحلیل کد، خطاها و آسیبپذیریهای احتمالی را شناسایی و رفع کرده و همچنین، با مطالعه دقیق کدها، شرایط و عملکردهای قرارداد هوشمند را به خوبی درک کنند.
- بررسی منابع خارجی قبل از اعتماد به آنها؛ کاربران میتوانند با استفاده از سرویسهای تأییدشده، صحت و بهروز بودن دادههای دریافتی از منابع خارجی را بررسی کرده و با مقایسه دادههای دریافتی از منابع خارجی مختلف، تفاوتها و تغییرات را شناسایی کنند.
- بررسی روشهای رمزنگاری و تحلیل ریاضی قبل از استفاده از آنها؛ کاربران میتوانند با استفاده از منابع معتبر، الگوریتمها و شیوههای رمزنگاری و تحلیل ریاضی را فرا گرفته و با استفاده از ابزارهای مختلف، عملکردهای الگوریتمها و شیوهها را تست و بررسی کنند.
- استفاده از کیف پول سختافزاری؛ کیف پولهای سختافزاری کلیدهای خصوصی را در دستگاههای سختافزاری ایمن ذخیره میکنند و از دسترسی غیرمجاز به داراییها محافظت میکنند.
- استفاده از قراردادهای هوشمند معتبر؛ کاربران باید از قراردادهای هوشمندی استفاده کنند که توسط توسعهدهندگان معتبر و با تجربه ایجاد شدهاند.
با اتخاذ این اقدامات، میتوان خطر آسیبپذیریهای قراردادهای هوشمند را کاهش داد و از استفاده از این فناوری نوآورانه برای بهبود فرآیندهای تجاری اطمینان حاصل کرد.
گفتار پایانی
در این مقاله، به بررسی آسیبپذیریهای قراردادهای هوشمند و راهکارهای در امان ماندن از آنها پرداختیم و نشان دادیم که قراردادهای هوشمند، با وجود مزایا و کاربردهای فراوانی که دارند، با چالشها و خطراتی هم دست و پنجه نرم میکنند که میتوانند منجر به زیانهای سنگین مالی شوند. برخی از آسیبپذیریهای رایج در قراردادهای هوشمند را شناسایی و معرفی کردیم و با برخی از روشهای مفید برای جلوگیری و رفع آنها آشنا شدیم.
امیدواریم که این مقاله، بتواند به فهم بهتر و استفاده بهینه از قراردادهای هوشمند کمک کند؛ توصیه میکنیم که قبل از توسعه یا استفاده از هر قرارداد هوشمندی، به دقت کد آن را بررسی، تست و حسابرسی کرده و از منابع معتبر و بهروز استفاده کنید. در پایان، لازم به ذکر است که قراردادهای هوشمند، هنوز در حال تکامل و پیشرفت هستند و ممکن است در آینده، روشها و ابزارهای جدیدتر و بهتری برای افزایش امنیت آنها ارائه شود. بنابراین، پیشنهاد میکنیم که همواره با آخرین تحولات و نوآوریها در این زمینه آشنا باشید.
سوالات متداول
- قرارداد هوشمند چیست؟
قرارداد هوشمند، برنامهای کامپیوتری است که روی بلاک چین، بر اساس شرایط و قوانینی که در کد آن تعریف شده، اجرا میشود و برای انجام عملیات مالی و منطقی به صورت خودکار، به واسطه یا دخالت انسانی نیازی ندارد.
- آسیبپذیریهای قراردادهای هوشمند چیست؟
آسیبپذیری قراردادهای هوشمند، خطا یا نقصی در کد قرارداد هوشمند است که میتواند منجر به عملکرد نادرست، تغییر حالت یا جابجایی پول شود.
- چگونه میتوان آسیبپذیریهای قراردادهای هوشمند را شناسایی کرد؟
برای شناسایی آسیبپذیریهای قراردادهای هوشمند، میتوان از روشهایی مانند بررسی کد، تست و حسابرسی امنیتی استفاده کرد؛ همچنین میتوان با شناخت آسیبپذیریهای رایج در قراردادهای هوشمند، به شناسایی آسیبپذیریها کمک کرد.
- چگونه میتوان از آسیبپذیریهای قراردادهای هوشمند در امان ماند؟
هم توسعهدهندگان و هم کاربران باید با اتخاذ کردن راهکارهای مختلف، از آسیبپذیری قراردادهای هوشمند پیشگیری کنند.